package api

import (
	"backend/app/model"
	"backend/app/web/service"
	"backend/utils/format"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// UserLoginHandler 玩家登录接口
// @Summary 玩家登录
// @Description 传入 username, password 玩家登录
// @Tags 玩家操作相关接口
// @Accept application/json
// @Produce application/json
// @Param object query model.UserLoginData false "玩家登录需要的信息"
// @Success 200
// @Router /api/v1/userapi/login [post]
func UserLoginHandler(c *gin.Context) {
	p := new(model.UserLoginData)
	if err := c.ShouldBind(p); err != nil {
		format.NewResponseJson(c).Error(format.CodeInvalidParam)
		return
	}
	data, err := service.UserService.Login(p, c)
	if err != nil {
		format.NewResponseJson(c).Error(err.GetErrorCode(), err.GetParams())
		return
	}
	format.NewResponseJson(c).Success(data)
}

// UserRegistHandler 玩家注册接口
// @Summary 玩家注册
// @Description 传入 username, password, repassword 玩家注册
// @Tags 玩家操作相关接口
// @Accept application/json
// @Produce application/json
// @Param object query model.UserRegistReqData false "玩家注册需要的信息"
// @Success 200
// @Router /api/v1/userapi/regist [post]
func UserRegistHandler(c *gin.Context) {
	p := new(model.UserRegistReqData)
	if err := c.ShouldBind(p); err != nil {
		zap.L().Error("UserRegisterHandler Req args is error:", zap.Error(err))
		format.NewResponseJson(c).Error(format.CodeInvalidParam)
		return
	}
	data, err := service.UserService.Regist(p, c)
	if err != nil {
		zap.L().Error("UserRegistHandler Regist is error: %v", zap.Any("err", err))
		format.NewResponseJson(c).Error(err.GetErrorCode(), err.GetParams())
		return
	}
	format.NewResponseJson(c).Success(data)
}

// UserGetUserInfoHandler 获取玩家账号信息接口
// @Summary 获取玩家账号信息
// @Tags 玩家操作相关接口
// @Accept application/json
// @Produce application/json
// @Success 200
// @Router /api/v1/userapi/userinfo [get]
func UserGetUserInfoHandler(c *gin.Context) {
	userIdValue, isExist := c.Get(model.CtxUserIDKey)
	if !isExist {
		zap.L().Error("UserGetUserInfoHandler Get CtxUserIDKey is not exist", zap.Bool("isExist", isExist))
		format.NewResponseJson(c).Error(format.CodeUserIdNotExist)
		return
	}
	userId, ok := userIdValue.(int64)
	if !ok {
		zap.L().Error("UserGetUserInfoHandler userId assert is failed")
		format.NewResponseJson(c).Error(format.CodeUserIdNotExist)
		return
	}
	data, err := service.UserService.GetUserInfo(userId)
	if err != nil {
		zap.L().Error("UserGetUserInfoHandler GetUserInfo is err", zap.Any("err", err))
		format.NewResponseJson(c).Error(err.GetErrorCode(), err.GetParams())
		return
	}
	menuTree, err := service.MenuService.GetMenuTree()
	if err != nil {
		zap.L().Error("UserGetUserInfoHandler GetMenuTree is err", zap.Any("err", err))
		format.NewResponseJson(c).Error(err.GetErrorCode(), err.GetParams())
		return
	}
	result := map[string]interface{}{
		"user":  data,
		"menus": menuTree,
	}
	format.NewResponseJson(c).Success(result)
}

// UserAddRoleHandler 玩家添加角色接口
// @Summary 玩家添加角色
// @Description 传入 role_name 玩家添加角色
// @Tags 玩家操作相关接口
// @Accept application/json
// @Produce application/json
// @Param object query model.UserAddRoleReqData false "玩家添加角色需要的信息"
// @Success 200
// @Router /api/v1/userapi/addrole [post]
func UserAddRoleHandler(c *gin.Context) {
	p := new(model.UserAddRoleReqData)
	if err := c.ShouldBind(p); err != nil {
		zap.L().Error("UserAddRoleHandler Req args is error:", zap.Error(err))
		format.NewResponseJson(c).Error(format.CodeInvalidParam)
		return
	}
	data, err := service.RoleService.AddRole(p, c)
	if err != nil {
		zap.L().Error("UserAddRoleHandler AddRole is err", zap.Any("err", err))
		format.NewResponseJson(c).Error(err.GetErrorCode(), err.GetParams())
		return
	}
	format.NewResponseJson(c).Success(data)
}
